/*************
author:: libo
license:: MIT
*****************/

//一些小算法
#ifndef LIBCELL_TOOLS_ALGORITHM_H_
#define LIBCELL_TOOLS_ALGORITHM_H_

#include<Mesh/_Func_.h>
#include<math.h>

#define quote lib_cell_quote

#ifdef __cplusplus
extern "C" {

#endif


double* mesh_compute_bounding_box_from_node(Node* n);
double* mesh_compute_bounding_box(Mesh* m);
//把mesh或者点云调整到[-1,1]的立方体里
void mesh_adjust_mesh_to_unit_hexahedron(Mesh* mesh);
//调整c的halffaces顺序，
//非单形也有效
//因为c的halffacess的顺序默认并不规则
//
Node* Mesh_adjust_halffaces(Mesh* m,template_c* c);
//交叉曲线也有效
//二维流形沿曲线切割
//非单形也有效
//tree储存新建的cell到被删的cell->id的映射
//tree1储存新建点到旧点的映射
//需要修改的地方: 需要储存新建点到旧点的映射

//int_rb_tree_free_value(tree);int_rb_tree_free(tree);
//int_rb_tree_free(tree1);
//the face doesn't need to be arranged in order 
void  Mesh_cut_along_the_curvef(Mesh* m,Node* faces,Int_RB_Tree*tree,Int_RB_Tree*tree1);


//tree储存新建的cell到被删的cell的映射
//tree1储存新建点到旧点的映射
//the vertices need arranged in order
void Mesh_cut_along_the_curvev(Mesh* m,Node* vertices,Int_RB_Tree* tree,Int_RB_Tree*tree1);

Node* split_unicom_region_from_sub_node( Node*node );

//分割连通区域
//对任意维流形都有效
Node* split_unicom_region( Mesh * m );

//分割连通区域,返回mesh
//对任意维流形都有效
Node* split_unicom_region2mesh(Mesh *m );

Node* get_shortest_path(Mesh* m, template_v* v1,template_v*v2);

double compute_surface_area(Mesh *m);

Node* create_surface_uniform_sampling_points(Mesh* m,int num,double dense);



#undef quote 
#ifdef __cplusplus
}
#endif

#endif